1 引子
软件的生命周期跟人的生命周期类似,开发测试阶段只是其中很短的一部分(怀胎十月),而后期的运营维护阶段占据了整个生命周期的绝大部分(人的生长发育到最后down掉的几十年)。
一个比较直观的数据,需求分析和设计占1/5,开发测试占1/5,运营维护占3/5(这个占比可能会比这个大得多,比如一个几个月搞定的项目,可能会使用几年甚至几十年)。
因此,一切工程化手段都希望能够提升软件的可维护性,让运维周期更长,从而降低成本。
模块化概念最先出现在工程设计领域,比较常见的例子就是电脑的各个组成元件,手机的各个元件;在模块化的设计和生产之后,各大厂商可以很方便的进行组装,只需要相应的组件规格匹配就行。
这里就需要一个共同认可的规格文档,说明相应的规范参数,比如CPU的引脚,形状尺寸;内存的金手指数,卡槽位置等。
引申到软件设计上来,模块化的对外规范就是与其他模块的交互入口,可以是接口、信号、事件等传递数据的方式。至于内部使用什么样的逻辑来实现,对外部模块使用者来说其实并不太关注。
2 JavaScript模块化
2.1 什么是模块?
前面大致已经讲到了,模块是一个比较通用的概念,就是一个独立的功能体,与其相似的名词有插件,组件;
2.2 为什么要模块化?
这个问题基本上已经回答了,简单列一下:
- 模块化后的功能代码更加独立,更容易修改和复用
- 独立的功能更容易组装,提高生产效率
- 始终都会有的一条,更容易维护
- 更容易组装生产、快速响应变化、缩短研发周期
2.3 怎么样做模块化?
还是先回到软件生命周期,看看整个运维过程中可能出现的问题。
- 代码在运维的过程中经过N轮需求更替,需求的变化可能与原来的有出入甚至是完全推翻
- 代码运维过程中开发人员的水平参差不齐,编码风格各异,即使有统一的规范也难以保持一致的风格
- 随着项目的迭代,原来高质量的代码质量逐渐降低,低质量的代码质量降到更低
- 随着时间的推移,现有的开发人员难以hold住原有代码的时候就面临着废弃或重写
针对上面的这些问题,我们能做什么?
- 功能抽象
在生产一个功能的时候,尽可能的将不变的内容和可变的内容分离,让可变的内容可配置,这样固定的部分就可以被最大限度的复用,解决了不断复制一大片代码,修改其中一点作为新用的问题。 - 学习的代码
新代码的写入,应该是与现有的代码环境相适应,不管遗产代码质量怎样,都会被作为学习的对象;进一步说,不管你写的这片代码质量怎样,将来都可能被学习甚至是被复制;所以,好好写现在的代码,别误导新同学。 - 大胆开发,细心测试
如果现有的代码已经难以被复用了,不得不复制一份的时候,在复制的同时,输出一份可复用的代码,让复制止于此,让后面的同学可以愉快地复用现有代码。 - 人人为我,我为人人;功在当下,利在千秋
跳出恶性循环,进入良性迭代,我们的工作虽然只是多增加一只蝴蝶,却能让蝴蝶效应来的更猛烈。
3 参考资料
最后更新: 2022年03月02日 03:32
原始链接: http://rawbin-.github.io/modules/2015-09-12-javascript-modular/